04. Números de punto flotante y redondeo

1. Números de punto flotante y la norma IEEE 754

Los números de punto flotante son números reales que tienen la forma:

\begin{equation} x = (-1)^\sigma m \times \beta^e, \end{equation}

donde $\beta\geq 2$ es un entero mayor que define la base, $m = (b_0.b_1\, b_2\, b_3 \cdots)_\beta$ es la mantisa o significante escrita en la base $\beta$, donde $b_i = {0, 1, \dots, \beta-1}$, y $\sigma$ sirve para definir el signo. Finalmente, $e$, el exponente, es un número entero. Para evitar las colas infinitas de nueves, que en binario son las de unos, uno además pide que $0\leq b_i \leq \beta-2$ para un número infinito de $i$'s.

Este conjunto es no numerable, como los reales. Esta representación no es única.

Llevar los reales a la computadora obviamente involucra hacer dos concesiones: en primer lugar, uno debe considerar conjuntos finitos de números como modelo de los reales, y en segundo término, que la representación sea única.

En particular, pedimos que el primer dígito $b_0$ no sea cero para todo $x$ distinto de cero; los números de punto flotante que satisfacen esta condición se llaman normales o normalizados.

Hacer que el número de bits (o sea, la base es $\beta=2$) sea finito no es suficiente considerar que la mantisa consista de un número finito de entradas, sino además que el rango de $e$ sea finito. Esto es:

\begin{eqnarray} m & = & (b_0.b_1\,b_2\,\cdots \, b_p),\\ e & \in & [ e_{min}, e_{max} ].\\ \end{eqnarray}

Aquí, $p$ se conoce como el número de dígitos significativos (precision en inglés), que no hay que confundir con la precisión (accuracy).

En el caso de la representación binaria, dado que $b_0=1$, entonces uno puede obviar esto, lo que significa que el bit $b_0$ no se guarda. A esta convención se le llama la regla del bit escondido (hidden bit rule).


Ejercicio 1

Dados $p$, $e_{min}$ y $e_{max}$, usando el sistema binario, ¿de cuántos números normales consiste el conjunto? ¿Y si se trata de otra base $\beta$? ¿Están uniformemente distribuidos los números normales? ¿Cuál es la distancia entre el 0 y el primer número positivo distinto de cero? NOTA Para guiar la respuesta, uno puede jugar con $\beta=2$, $p=2$, $e_{min} = -1$ y $e_{max} = 2$, pero la idea es obtener expresiones generales.

(Entre paréntesis, a estas alturas del partido deben haber escrito funciones que permiten pasar de un entero a una cadena binaria equivalente, y viceversa, y de un número de punto flotante en base 10 al equivalente en binario, y viceversa. No sólo se trata de que estas funciones estén escritas, sino de que nos sean útiles, o sea, de que den resultados que podemos confiar y usar.)


In [ ]:


Ejercicio 2

¿Cómo se representa al $x=0$ en el conjunto anterior? ¿Funciona la regla del bit escondido para una base $\beta>2$?


In [ ]:

Del ejercicio 1 arriba, uno se da cuenta de que hay una distancia anómalamente grande entre 0 y el primer número positivo. Esto trae problemas prácticos relacionados con la pérdida de precisión cuando se tienen cantidades cercanas a cero. La manera de evitar esto es permitir que haya ciertos números que no son normales; a éstos se les llama subnormales. Un número distinto de cero es subnormal si $b_0=0$. Esto permite llegar a cero de manera gradual al incorporar estos números al conjunto de números representables.


Ejercicio 3

En el ejemplo de juguete anterior ($\beta=2$, $p=2$, $e_{min} = -1$ y $e_{max} = 2$) enumera los posibles números subnormales. ¿Cómo cambia la distancia de 0 al número positivo más próximo? ¿El espaciamiento entre los números subnormales, es uniforme?


In [ ]:


Ejercicio 4

¿Qué expresiones definen a $N_{min}$ y $N_{max}$, los números de punto flotante (positivos) mínimo y máximo? Obtén los resultados para los números normales y los subnormales.

La norma IEEE 754 define el estándar de la representación de los números de punto flotante en las computadoras. En particular, aquí nos interesará la representación en doble precisión o de 64-bits, que consiste en el primer bit que contiene el signo $\sigma$, de un exponente $e$ de 11-bits que tiene un sesgo (bias) $B_*$ y de la mantisa que consta de $p=52$ bits (de facto, $p=53$, si se incluye la regla del bit escondido). El resultado claramente son los 64 bits de almacenamiento.

El sesgo se introduce por la siguiente razón. Sin sesgo, el exponente $e$ varía entre 0 y $2^{E_*} - 1$, donde $E_*$ son el número de bits asignados al exponente. Entonces, el sesgo se introduce restando $B_* = 2^{E_*-1} - 1$ del exponente, lo que de facto hace que el rango del exponente sea $e \in [-2^{E_*-1} + 1, 2^{E_*-1}]$.


Ejercicio 5

Usando bits y un poco de imaginación, cuáles son las reglas para representar

  • $x=$NaN

  • $x=$Inf

  • un número $x>0$ normal

  • un número $x$ subnormal

  • $x=0.0$ y $x = -0.0$


In [ ]:


Ejercicio 6

  • Dado que los números de punto flotante son finitos, construye la representación decimal de dos números normales de punto flotante consecutivos, y dos subnormales consecutivos.

  • ¿Cuál es la representación binaria del promedio de esos dos números? ¿Qué obtienes a partir de tus programas?

  • ¿Cuál es la representación binaria de la diferencia?


In [ ]:


Ejercicio 7 Donde todo esto, y mucho más, puede ser importante...

Escribe una función que evalúe

\begin{equation} f(x,y) = 333.75 y^6 + x^2 (11 x^2 y^2 - y^6 - 121 y^4 - 2) + 5.5 y^8 + \frac{x}{2y} \end{equation}

Usando esta función, demuestra que $f(x=77617, y=33096) = -0.8273960599468214$.

NOTA Los números han sido verificados y son correctos :-)


In [ ]:


Ejercicio 8

Pensando en que vas a generar datos para hacer una gráfica (con suficientes puntos), genera dichos datos para los polinomios $f(x) = (1-x)^6$ y $g(x) = x^6 -6x^5 + 15x^4 -20 x^3 + 15x^2 - 6 x + 1$, en el dominio $0.995 \leq x \leq 1.005$. ¿Hay algo sorprendente en esto?


In [ ]:


Ejercicio 9

Explica por qué es mala idea usar como paso de integración $0.1$ o $0.01$, u otros valores de este estilo. ¿Qué pasa con el tiempo que vas calculando en cada paso de la integración?


In [ ]: